// const list=[
//     {id:19,parentId:0},
//     {id:18,parentId:16},
//     {id:17,parentId:16},
//     {id:16,parentId:0},
// ]
// const tree={
//     id:0,
//     children:[
//         {
//             id:19,
//             parentId:0
//         },
//         {
//             id:16,
//             parentId:0,
//             children:[
//                 {
//                     id:18,
//                     parentId:16,
//                 },
//                 {
//                     id:17,
//                     parentId:16,
//                 }
//             ]
//         }
//     ]
// }
// const result=conver(list,'parentId','id',0)
// function conver(list,parentKey,currentKey,rootValue){
//     let map=new Map()
//     list.forEach(item=>{
//         if(map.has(item[parentKey])){
//             map.set(item[parentKey],[...map.get(item[parentKey]),item[currentKey]])
//         }else{
//             map.set(item[parentKey],[item[currentKey]])
//         }
//     })
//     let res={
//         [currentKey]:rootValue,
//         children:[],
//     }
//     if(map.has(rootValue)){
//         map.get(rootValue).forEach(item=>{
//             res.children.push(conver(list,parentKey,currentKey,item))
//         })
//     }
//     return res
// }
// console.log(result);


function convert(list, parentKey, currentKey, rootValue) {    
    // 创建节点映射和根节点
    //先创建树的根节点
    const nodeMap = new Map();
    const root = { [currentKey]: rootValue, children: [] };
    
    // 第一次遍历：将所有节点添加到映射表中
    //将list中的每个元素加上children属性后添加进行nodeMap对象中
    list.forEach(item => {
        // 复制节点并添加children数组
        const node = { ...item, children: [] };
        nodeMap.set(node[currentKey], node);
    });
    
    // 第二次遍历：构建树结构
    list.forEach(item => {
        //拿到当前节点，以及其父节点id
        const node = nodeMap.get(item[currentKey]);
        const parentId = item[parentKey];
        //如果当前节点的父节点id等于根节点的值，那么当前节点就是根节点的子节点
        if (parentId === rootValue) {
            // 添加到根节点
            root.children.push(node);
        } else {//如果当前节点的父节点id不等于根节点的值，就拿父组件id去nodeMap对象内找父组件
            // 查找父节点
            const parent = nodeMap.get(parentId);
            if (parent) {
                //如果找到父节点，就将当前节点添加到父节点的children数组中
                parent.children.push(node);
            } else {
                // 如果没有找到父节点，可以选择忽略或记录警告
                console.warn(`Parent node with ${currentKey} ${parentId} not found for node ${node[currentKey]}`);
            }
        }
    });
    
    return root;
}

// 测试代码
const list = [
    {id:19, parentId:0},
    {id:18, parentId:16},
    {id:17, parentId:16},
    {id:16, parentId:0},
];

const result = convert(list, 'parentId', 'id', 0);
console.log(JSON.stringify(result, null, 2));